// 这里是所有路由的操作，操作数据库肯定是异步的，所以async

const service = require("../service/menu.service.js");
const utils = require("../utils/utils");
class UserController {
  // 递归查找所有子节点
  static async deepSearchAll(menuIds, menuIdAll) {
    // 查询出parentId === menuId对应节点的所有id
    const res = await service.searchAll(menuIds);
    let newIds = [];
    res.length &&
      res.forEach((e) => {
        newIds.push(e.menuId);
        menuIdAll.push(e.menuId);
      });
    if (newIds.length) {
      return UserController.deepSearchAll(newIds, menuIdAll);
    } else {
      return menuIdAll;
    }
  }
  // 递归生成菜单树列表
  static getTreeMenu(menuList) {
    // 定义目标数组
    let obj = [];
    for (let i in menuList) {
      // 如果当前索引值的pid为空，那么就代表当前的索引值为“根级”数据，那么直接push到目标数组里
      if (!menuList[i].parentId) {
        obj.push(menuList[i]);
      } else {
        let item = menuList.find((ele) => ele.menuId === menuList[i].parentId);
        item.child = menuList[i];
      }
    }
    return obj;
  }
  // 增-编辑-删方法 action:[add, edit, delete]
  async operate(ctx, next) {
    try {
      // 获取用户请求传递的参数
      const { menuId, action, ...params } = ctx.request.body;
      let info = "";
      let res = null;
      if (action === "add") {
        // 创建
        res = await service.create(params);
        info = "创建成功！";
      } else if (action === "edit") {
        // 编辑\更新时间
        params.updateTime = new Date();
        // 通过id进行更新操作
        res = await service.edit(menuId, params);
        // 更新时没有对应的更新的菜单id
        if (res[0] === 0) {
          return (ctx.body = utils.fail("编辑失败！"));
        }
        info = "编辑成功！";
      } else {
        // 删除-需要删除子节点
        // 1、递归查询所有子节点
        let menuIdAll = [menuId];
        const res = await UserController.deepSearchAll([menuId], menuIdAll);
        // 2、批量删除
        await service.deleteMenu(res);
        info = "删除成功！";
      }
      // 返回数据
      ctx.body = utils.success(info);
    } catch (error) {
      ctx.body = utils.fail(error.message);
    }
  }
  // 查询菜单列表
  async menuList(ctx, next) {
    try {
      // 获取用户请求传递的参数
      const { menuName, menuState } = ctx.request.body;
      let params = {};
      if (menuName) {
        params.menuName = menuName;
      }
      if (menuState) {
        params.menuState = menuState;
      }
      // 根据名字 || 状态查列表
      const menuList = await service.menuList(params);
      const treeList = UserController.getTreeMenu(menuList);
      ctx.body = utils.success("查询成功！", treeList);
    } catch (error) {
      ctx.body = utils.fail(error.stack);
    }
  }
}

module.exports = new UserController();
